<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
<script>
	function Shape() {
		Shape.prototype.name = 'shape';
		Shape.prototype.toString = function() {
			var conste = this.constructor;
			var xxx;
			if(conste.ubers){
				xxx = this.conste.ubers.toString() + ', ' + this.name
			}else{
				xxx = this.name
			};
			return xxx;
		}
	}

	function TwoDShape() {};
	var F = function() {};
	F.prototype = Shape.prototype;
	TwoDShape.prototype = new F();
	TwoDShape.prototype.constructor = TwoDShape;
	TwoDShape.ubers = Shape.prototype;
	TwoDShape.prototype.name = '2D shape';

	function Triangle(side, height) {
		this.side = side;
		this.height = height;
	}

	var F = function() {};
	F.prototype = TwoDShape.prototype;
	Triangle.prototype = new F();
	Triangle.prototype.constructor = Triangle;
	Triangle.ubers = TwoDShape.prototype;

	Triangle.prototype.name = 'Triangle';
	Triangle.prototype.getArea = function(){
		return this.side * this.height / 2;
	}

	// 在这里，我们主要新增了一下内容
	// 1、讲ubers属性设置成指向其父级原型的引用
	// 2、对toString()方法进行了更新。
	// 在此之前，toString()所做的仅仅只是返回this.name而已。现在我们为他新增了一项额外的任务，就是检查对象中是否存在this.constructor.uber属性，如果存在的话，就先调用该属性的toString()方法。由于this.constructor本身是一个函数，而this.constructor.uber则是指向当前对象父级原型的引用，所以当我们调用Trangle实体的toString()方法时，其原型链上所有的toString()都会被引用
	var my = new Triangle(5, 10);
	console.log(my.toString());

	// 另外，uber属性的名字原本应该是‘superoclass’，但这样一来好像显得JavaScript中就有了类的概念，或许应该叫做‘super’，但super是JavaScript的保留字，因而采用了Uber
</script>
</body>
</html>